﻿namespace Vin.Tool.Core.DateTimeCategory;

public static partial class Extension
{
    /// <summary>
    /// 获取指定日期所在周的第一天的日期。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期所在周的第一天的日期。</returns>
    public static DateTime GetFirstDayOfWeek(this DateTime date) => DateTimeTool.GetFirstDayOfWeek(date);

    /// <summary>
    /// 获取指定日期所在月份的第一天的日期。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期所在月份的第一天的日期。</returns>
    public static DateTime GetFirstDayOfMonth(this DateTime date) => DateTimeTool.GetFirstDayOfMonth(date);


    /// <summary>
    /// 获取指定日期所在季度的第一天的日期。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期所在季度的第一天的日期。</returns>
    public static DateTime GetFirstDayOfQuarter(this DateTime date) => DateTimeTool.GetFirstDayOfQuarter(date);

    /// <summary>
    /// 获取指定日期所在年份的第一天的日期。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期所在年份的第一天的日期。</returns>
    public static DateTime GetFirstDayOfYear(this DateTime date) => DateTimeTool.GetFirstDayOfYear(date);

    /// <summary>
    /// 计算指定日期和当前日期之间的天数差。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期和当前日期之间的天数差。</returns>
    public static int GetDaysBetween(this DateTime date) => DateTimeTool.GetDaysBetween(date);

    /// <summary>
    /// 计算两个日期之间的天数差。
    /// </summary>
    /// <param name="date1">第一个日期。</param>
    /// <param name="date2">第二个日期。</param>
    /// <returns>两个日期之间的天数差。</returns>
    public static int GetDaysBetween(this DateTime date1, DateTime date2) => DateTimeTool.GetDaysBetween(date1, date2);

    /// <summary>
    /// 计算指定日期和当前日期之间的工作日数差。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期和当前日期之间的工作日数差。</returns>
    public static int GetWorkDaysBetween(this DateTime date) => DateTimeTool.GetWorkDaysBetween(date);

    /// <summary>
    /// 计算两个日期之间的工作日数差。
    /// </summary>
    /// <param name="date1">第一个日期。</param>
    /// <param name="date2">第二个日期。</param>
    /// <returns>两个日期之间的工作日数差。</returns>
    public static int GetWorkDaysBetween(this DateTime date1, DateTime date2) =>
        DateTimeTool.GetWorkDaysBetween(date1, date2);

    /// <summary>
    /// 判断指定日期是否是工作日。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>如果是工作日，则返回 true；否则返回 false。</returns>
    public static bool IsWorkDay(this DateTime date) => DateTimeTool.IsWorkDay(date);

    /// <summary>
    /// 获取指定日期所在周的所有日期。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期所在周的所有日期。</returns>
    public static List<DateTime> GetWeekDays(this DateTime date) => DateTimeTool.GetWeekDays(date);

    /// <summary>
    /// 获取指定日期所在月份的所有日期。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期所在月份的所有日期。</returns>
    public static List<DateTime> GetMonthDays(this DateTime date) => DateTimeTool.GetMonthDays(date);

    /// <summary>
    /// 获取指定日期所在季度的所有日期。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期所在季度的所有日期。</returns>
    public static List<DateTime> GetQuarterDays(this DateTime date) => DateTimeTool.GetQuarterDays(date);

    /// <summary>
    /// 获取指定日期所在年份的所有日期。
    /// </summary>
    /// <param name="date">指定日期。</param>
    /// <returns>指定日期所在年份的所有日期。</returns>
    public static List<DateTime> GetYearDays(this DateTime date) => DateTimeTool.GetYearDays(date);

    /// <summary>
    /// 转换为日期字符串。
    /// </summary>
    /// <param name="date"></param>
    /// <returns></returns>
    public static string? ToDateTimeString(this DateTime? date) => date?.ToString("yyyy-MM-dd HH:mm:ss");

    /// <summary>
    /// 当日期为空时，返回当前日期 + day 天。
    /// </summary>
    /// <param name="date"></param>
    /// <param name="day"></param>
    /// <returns></returns>
    public static DateTime ModifiedDateOfNull(this DateTime? date, int day = 0) =>
        DateTimeTool.ModifiedDateOfNull(date, day);
}